/*
 * Copyright 2004-2005 asoft
 * 本软件及其所有拷贝的名称，与光盘上或本软件中注明的公司同在。
 * 本软件及文档享有版权，并受国家版权法及国际协约条款的保护。
 * 您不可以从本软件中去掉其版权声明；并保证为本软件的拷贝（本部或部分）* 复制版权声明。
 * 您同意制止以任何形式非法拷贝本软件及文档。
 * 版权信息参见：
 *      http://www.asoft.cn/licenses
 */

package com.asoft.common.base.manager;

import java.io.Serializable;
import java.util.List;

import org.apache.log4j.Logger;

import com.asoft.common.base.dao.DAO;
import com.asoft.common.base.model.BaseObject;

/**
 * Base class for Business Services - use this class for utility methods and
 * generic CRUD methods.
 *
 * <p><a href="BaseManager.java.html"><i>View Source</i></a></p>
 *
 * @author <a href="mailto:matt@raibledesigns.com">Matt Raible</a>
 */
public abstract class BaseManager implements Manager
{

        static Logger logger = Logger.getLogger(BaseManager.class);

        /** 实体类 */
        private Class entityClass;

        protected DAO dao = null;

        public Class getEntityClass()
        {
                return this.entityClass;
        }

        public void setEntity(BaseObject entity)
        {
                this.entityClass = entity.getClass();
        }

        /**
         * 依赖注入dao
         */
        public void setDAO(DAO dao)
        {

                this.dao = dao;
        }
        
        /**
         * 向数据库插入一条记录(BaseObject)
         *
         * @param: Object model BaseObject的子类型，为unsave
         *
         * return saved类型的 BaseObject，其id已经被附值
         */
        public Object save(Object o)
        {
                return this.dao.save(o);
        }
        
        /**
         * 新增实体s
         * reutnr 修改后的实体s
         */
        public List saveAll(List objs)
        {
                return this.dao.saveAll(objs);
        }

        /**
         * 更新数据入一条记录(BaseObject)
         *
         * @param: Object model BaseObject的子类型
         *
         * return saved类型的 BaseObject
         */
        public Object update(Object o)
        {
                return this.dao.update(o);
        }

		/**
         * 修改实体s
         * reutnr 修改后的实体s
         */
        public List updateAll(List objs)
        {
                return this.dao.updateAll(objs);
        }

        /**
         * 批量插入or更新记录(BaseObject)
         *
         * @param: Object model BaseObject的子类型
         *
         * return saved类型的 BaseObject
         */
        public List saveOrUpdateAll(List objs)
        {
                return this.dao.saveOrUpdateAll(objs);
        }

        /**
         * 删除一条记录(BaseObject)
         *
         * @param: Object model BaseObject的子类型
         */
        public void remove(Object obj)
        {
                this.dao.remove(obj);
        }

        /**
         * 批量删除多条记录(BaseObject)
         *
         * @param: Object model BaseObject集合
         */
        public void removeAll(List objs)
        {
                this.dao.removeAll(objs);
        }
        
        /**
         * 清空所有数据
         * @warn:　用于单元测试用,危险的api
         */
        public void clearAll()
        {
                throw new UnsupportedOperationException("危险的api,仅仅供dao单元测试专用");
        }

        /**
         * 查询byId
         *
         * @ param: id
         * @ return 查询结果
         */
        public Object get(Serializable id)
        {
                return this.dao.get(id);
        }
        
        /**
         * 查询byCode
         *
         * @ param: id
         * @ return 查询结果
         */
        public Object getByCode(String code)
        {
                return this.dao.getByCode(code);
        }

        /**
         * 切换pri
         *
         * @ param: sBO 源bo
         * @ param: destBO 目标bo
         */
        public void changePri(BaseObject sBO,BaseObject destBO)
        {
                String bePri = sBO.getPri();
                String destPri = destBO.getPri();
                destBO.setPri(bePri);
                sBO.setPri(destPri);
                logger.debug("保存sBO " + sBO.toString());
                this.dao.update(sBO);
                logger.debug("保存destBO " + destBO.toString());
                this.dao.update(destBO);
        }

        /**
         * 清楚session缓存
         */
        public void evict(Object obj)
        {
                this.dao.evict(obj);
        }

        /**
         * 作废然后新增
         *    用于维护记录的所有版本而使用的
         */
        public Object blankOutThenSave(Object obj)
        {
                return this.dao.blankOutThenSave(obj);
        }
}
